﻿import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import { getToken } from "@/utils/auth"; // getToken from cookie

NProgress.configure({
	showSpinner: true,
}); // NProgress configuration

const whiteList = ["/login"]; // no redirect whitelist

router.beforeEach(async (to, from, next) => {
	NProgress.start(); // start progress bar
	const hasToken = getToken();

	if (hasToken) {
		if (to.path === '/login') {
			// if is logged in, redirect to the home page
			next({ path: '/' });
			NProgress.done();
		} else {
			// determine whether the user has obtained his permission roles through getInfo
			const hasRoles = store.getters.roles && store.getters.roles.length > 0
			// console.log('hasRoles: ', hasRoles,store.getters.roles);
			if (hasRoles) {
				next();
			} else {
				try {
					// get user info
					// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
					const { roles } = await store.dispatch('GetInfo');

					// generate accessible routes map based on roles
					const accessRoutes = await store.dispatch('generateRoutes',roles);
					// dynamically add accessible routes
					router.addRoutes(accessRoutes);
					next({ ...to, replace: true });
				} catch (error) {
					// remove token and go to login page to re-login
					await store.dispatch('FedLogOut');
					Message.error(error || 'Has Error');
					next(`/login?redirect=${to.path}`);
				}
			}
			NProgress.done();
		}
	} else {
		/* has no token*/

		if (whiteList.indexOf(to.path) !== -1) {
			// in the free login whitelist, go directly
			next()
		} else {
			// other pages that do not have permission to access are redirected to the login page.
			next(`/login?redirect=${to.path}`)
			NProgress.done()
		}
	}
});

router.afterEach(() => {
	NProgress.done(); // finish progress bar
});
